package com.ruoyi.web.controller.task;

import com.ruoyi.combat.domain.equiplocation.CombatEquipInfo;
import com.ruoyi.combat.domain.equiplocation.CombatEquipTask;
import com.ruoyi.combat.domain.request.AntiAttributionCallbackRequest;
import com.ruoyi.combat.mapper.equiplocation.CombatEquipInfoMapper;
import com.ruoyi.combat.mapper.equiplocation.CombatEquipTaskMapper;
import com.ruoyi.combat.service.equiplocation.ICombatEquipInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Random;

@Component
public class ScheduledTasks {

    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

    @Autowired
    private CombatEquipTaskMapper combatEquipTaskMapper;
    @Autowired
    private CombatEquipInfoMapper combatEquipInfoMapper;

    @Autowired
    private ICombatEquipInfoService combatEquipInfoService;

    /**
     * 每5分钟执行一次的定时任务
     */
//    @Scheduled(fixedRate = 1 * 60 * 1000)
    public void reportCurrentTime() {
        System.out.println("当前时间: " + LocalDateTime.now().format(dateTimeFormatter));
        // 在这里添加你需要定时执行的业务逻辑

        // 查询任务表中所有执行中的任务
        CombatEquipTask combatEquipTask = new CombatEquipTask();
        combatEquipTask.setTaskState("1");
        List<CombatEquipTask> combatEquipTasks = combatEquipTaskMapper.selectCombatEquipTaskList(combatEquipTask);
        if (combatEquipTasks != null && combatEquipTasks.size() > 0) {
            for (CombatEquipTask task : combatEquipTasks) {
                // 获取目标IP
                String protectedIp = task.getProtectedIp();
                if (protectedIp != null && !"".equals(protectedIp)) {
                    // 根据IP查询设备信息
                    CombatEquipInfo combatEquipInfo = combatEquipInfoMapper.selectCombatEquipInfoByIp(protectedIp);
                    if (combatEquipInfo != null) {
                        // 获取抗定位前风险距离和抗定位前经纬度
                        String beforeRiskDistance = combatEquipInfo.getBeforeRiskDistance();
                        String beforeEquipRiskLat = combatEquipInfo.getBeforeEquipRiskLat();
                        String beforeEquipRiskLon = combatEquipInfo.getBeforeEquipRiskLon();

                        if (beforeRiskDistance != null && !"".equals(beforeRiskDistance) && beforeEquipRiskLat != null && !"".equals(beforeEquipRiskLat) && beforeEquipRiskLon != null && !"".equals(beforeEquipRiskLon)) {
                            // 根据抗定位前经纬度和风险距离，模拟抗定位后风险距离，要求大于30KM
                            // 随机生成一个数字，大于30
                            // 创建 Random 对象
                            Random random = new Random();
                            // 生成一个大于 30 且小于 130 的随机数
                            double randomNumber = 30 + random.nextDouble() * 100;
                            // 创建 DecimalFormat 对象，用于格式化输出，保留五位小数
                            DecimalFormat df = new DecimalFormat("#.00000");
                            // 格式化随机数
                            String formattedNumber = df.format(randomNumber);
                            String afterRiskDistance = formattedNumber;
                            // 根据这个随机数，根据抗定位前经纬度，模拟抗定位后经纬度
                            String afterEquipRiskLat = "";
                            String afterEquipRiskLon = "";
                            try {
                                // beforeEquipRiskLat和beforeEquipRiskLon都加2
                                afterEquipRiskLat = String.valueOf(Double.parseDouble(beforeEquipRiskLat) + 2);
                                afterEquipRiskLon = String.valueOf(Double.parseDouble(beforeEquipRiskLon) + 2);
                                if (afterEquipRiskLat != null && !"".equals(afterEquipRiskLat) && afterEquipRiskLon != null && !"".equals(afterEquipRiskLon)) {
                                    AntiAttributionCallbackRequest request = new AntiAttributionCallbackRequest();
                                    request.setTaskId(task.getId());
                                    request.setEquipEstime(task.getEndtime());
                                    request.setAfterEquipRiskLat(afterEquipRiskLat);
                                    request.setAfterEquipRiskLon(afterEquipRiskLon);
                                    request.setAfterRiskDistance(afterRiskDistance);
                                    request.setEquipEstime(new Date());
                                    combatEquipInfoService.antiAttributionCallback(request);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }
}
